home *** CD-ROM | disk | FTP | other *** search
-
- Menu.mod
- ==============
-
-
- Dieses Modul vereinfacht das Erstellen von Menüs in eigenen Programmen.
- Es untersützt KickStart 1.3 und 2.0, kann beliebige Zeichensätze (auch
- proportionale) verarbeiten und kreiert bei zu kleinem Bildschirm oder
- zu großem Zeichensatz bei Bedarf automatisch zweispaltige Menüs.
-
-
- Benutzung:
-
-
- Um die von Menu.mod erzeugte Menüstruktur zu speichern, muß man sich
- zunächst eine Variable deklarieren:
-
- VAR
- menu: Intuition.MenuPtr;
-
-
- Nun muß zunächst ein Fenster geöffnet werden, das mit dem Menü versehen
- werden soll (es können später auch mehrere Fenster, die auf dem selben
- Screen geöffnet wurden, mit dem selben Menü gleichzeitig arbeiten).
-
- window := I.OpenWindow(...);
-
-
- Nun kann das Erzeugen des Menüs gestartet werden:
-
- Menu.StartMenu(window);
-
-
- Nun werden nacheinander die Menüstreifen festgelegt. Dazu ruft man
- zunächst
-
- Menu.NewMenu("Project");
-
- auf. In diesem Fall ist das erste Menü das Project Menu.
-
-
- Jetzt werden nacheinander die Items erzeugt. Dazu gibt es verschiedene
- Möglichkeiten:
-
-
- Menu.NewItem("Open","O");
-
- Hier wird ein gewöhnliches Item mit dem Namen 'Open' under dem Keyboard-
- Shortcut Amiga+'O' erzeugt.
-
-
- Menu.NewItem("About",0X);
-
- So wird ein Item ohne Keyboard-Shortcut erzeugt.
-
-
- Menu.NewItem2("Quit","^Q");
-
- Dieser Aufruf erzeugt ein Item mit dem Namen 'Quit'. Rechtsbündig wird in
- diesem Menüpunkt zusätzlich '^Q' dargestellt. Dies ist gedacht für den
- Tastatur-Abkürzung Control+'Q'. Solche Abkürzungen werden von Intuition
- nicht automatisch verwaltet und müssen im eigenen Programm selbst
- überprüft werden (siehe Test.mod).
-
-
- Menu.NewItemChecked("Save Icons","I",TRUE);
-
- Es wird ein Item wie mit NewItem() mit den Namen 'Save Icons' und der
- Abkürzung Amiga+'I' erzeugt. Auch hier kann statt "I" 0X angegeben werden,
- um keine Abkürzung zuzulassen. Zusätzlich bekommt dieses Item ein Häkchen
- (CheckMark). Der letzte Parameter gibt an, ob dieses Häkchen zu beginn
- gesetzt (TRUE) oder nicht gesetzt (FALSE) sein soll.
-
-
- Menu.NewItem2Checked("Auto Save all 10 minutes","^A",FALSE);
-
- Hier wird, ähnlich NewItem2() der Text "^A" rechtsbündig im Menü
- dargestellt. Ansonsten erzeugt NewItem2Checked() das gleiche Menü wie
- NewItemChecked().
-
-
- Menu.Seperator;
-
- Dieser Aufruf erzeugt eine horizontale Zick-Zack-Linie, mit der mehrere
- Menüpunkte Gruppiert werden können. Intern ist diese Linie ein deaktiviertes
- MenuItem, so daß für diese Linie eine Menünummer verbraucht wird (Das wird
- beim interpretieren von IntuiMessages vom Typ MenuPick wichtig, siehe
- Test.mod).
-
-
- Die letzten 5 Prozeduren können nun beliebig oft nacheinander aufgerufen
- werden. Danach können weitere Menüstreifen mit NewMenu() etc. nach dem
- gleichen Schema erzeugt werden.
-
-
- Das Erzeugen des Menüs wird mit
-
- menu := Menu.EndMenu();
-
- abgeschlossen.
-
-
- Um dieses Menü jetzt zu benutzen, wird es mit
-
- IF Intuition.SetMenuStrip(window,menu^) THEN ...
-
- an das Fenster gebunden.
-
-
- Eingaben über dieses Menü können wie gewohnt als IntuiMessages vom userPort
- des Fensters gelesen werden.
-
- Die Menünummern werden folgendermaßen verteilt:
-
- MenuNum: 1. Streifen: 0
- 2. Streifen: 1
- 3. Streifen: 2 etc.
-
- ItemNum: 1. Item: 0
- 2. Item: 1
- 3. Item: 3 etc.
-
- Zu beachten ist bei den Items, daß ein Seperator auch als Item zählt. So
- hat folgendes Menü folgende Nummern:
-
- Project MenuNum ItemNum
- Open O 0 0
- Close C 0 1
- --------
- Quit Q 0 3
-
-
- Wird das Menü nicht mehr benötigt, kann es mit
-
- Intuition.ClearMenuStrip(window);
- Menu.DisposeMenu(menu);
-
- vom Fenster gelöst und der benötigte Speicher freigegeben werden. Dies ist
- jedoch gewöhnlich nicht nötig, da der Speicher bei Programmende automatisch
- freigegeben wird.
-
-
- Speicher:
-
- Wie dem aufmerksamen Programmierer vielleicht aufgefallen ist, können die
- gesamten Prozeduren von Menu.mod nicht fehlschlagen und nirgends ist eine
- Abfrage nötig, ob z.B. genügend Speicher vorhanden war.
-
- Ist nicht genügend Speicher vorhanden, bricht Menu.mod einfach mit HALT(20)
- ab. Ist dies nicht gewünscht, kann man sich selbst einen Speichermangel-
- Handler schreiben, der z.B. folgendermaßen aussieht:
-
-
- Diese Prozedur kann natürlich bei bestimmten Anwendungen noch sehr viel
- Intelligenter gestaltet werden, so daß sie z.B. nicht unbedingt benötigten
- Speicher freigibt.
-
- Menu.mod muß nur noch mitgeteilt werden, daß diese Prozedur bei Speicher-
- mangel aufgerufen werden soll:
-
- Menu.oom := OutOfMem;
-
- Zu beachten ist, daß diese Prozedur auf jeden Fall eine Möglichkeit vorsehen
- sollte, daß Programm abzubrechen, da sich das Programm sonst bei Speicher-
- mangel in eine Endlosschleife verrent. Also NICHT:
-
- PROCEDURE * OutOfMem;
- BEGIN
- IF MyPtr#NIL THEN DISPOSE(MyPtr) END;
- END OutOfMem;
-
- sondern:
-
- PROCEDURE * OutOfMem;
- BEGIN
- IF MyPtr#NIL THEN DISPOSE(MyPtr) ELSE HALT(20) END;
- END OutOfMem;
-
- Bei diesem Beispiel wird beim ersten Aufruf von OutOfMem evtl. Speicher
- freigegeben. war dies jedoch nicht genugt, wird beim zweiten Aufruf das
- Programm abgebrochen.
-
-
- Viel Spaß!
-
-
- --- Fridtjof.
-
-